Tout ce dont votre package a besoin

Joseph Barbier - PyCon2025

A propos


Freelance

Open source

Data(viz)

Questions



Qui ne sait pas du tout ce qu’est un package Python ?


Qui a déjà créé un package Python ?


Qui contribue à des packages Python open source ?


Qui a déjà mis sur PyPI un package Python ?

Le bon package et le mauvais package

Un bon package c’est pas (uniquement) une question de code.

  • facile à comprendre ?
  • facile à utiliser ?
  • facile à développer ?

TLDR: package Python

def my_super_cool_function(arg):
    if arg == "cool":
        something = 123
    else:
        ...

    ...

    return something

Facilement distribuable et donc reutilisable !

Sommaire



Votre package a besoin de ces 4 choses, la dernière va vous surprendre 😱 !


  • Ne jamais commit une erreur

  • Tester dans les meilleures conditions

  • Configuration du pyproject.toml

  • Créer la meilleure documentation

Parlons style de code !

def add_nums(  A ,B):return A+B

def add_nums(  A ,B):return A+B

import numpy as np
def add_nums_numpy(  A ,B):
                    return np.sum([A, B])

def add_nums(  A ,B):return A+B

import numpy as np
def add_nums_numpy(  A ,B):
                    return np.sum([A, B])


def divideNums( A , B):
        return A/B
def multiply(a,b ):
 return  a *b

def add_nums(  A ,B):return A+B

import numpy as np
def add_nums_numpy(  A ,B):
                    return np.sum([A, B])


def divideNums( A , B):
        return A/B
def multiply(a,b ):
 return  a *b

def main( ) :
    x= add_nums(2,  3)
#some comment
    y=multiply( x ,4 )                            # in the middle of the sea
    print( "sum:",x  )
    print("product:" ,  y)


A quelle ligne sera la première erreur?

Code parfaitement valide ✅

On prend le même code, mais on le standardise

import numpy as np


def add_nums(A, B):
    return A + B

def add_nums_numpy(A, B):
    return np.sum([A, B])

def divideNums(A, B):
    return A / B

def multiply(a, b):
    return a * b

def main():
    x = add_nums(2, 3)
    # some comment
    y = multiply(x, 4)  # in the middle of the sea
    print("sum:", x)
    print("product:", y)
  • indentation ✅
  • commentaires ✅
  • import ✅
  • sauts de ligne ✅


ruff est probablement la meilleure option


2 manières d’utiliser :

  • “on save”
  • pre-commit

→ pre-commit est le plus important!

Git


  • Git c’est Google Drive sous stéroïdes, mais pour des fichiers légers
  • comme des fichiers textes par exemple…
  • … et donc des fichiers de code!




  • Git c’est surtout l’historique, avec les commits
  • Mais on veut que l’historique soit propre !

pre-commit


A chaque commit, fait tourner une série de check qu’on aura définit


Vous n’avez plus à penser à cela, tout est vérifié en amont

Tests

Tester son code ça veut dire quoi ?

  • vérifier que le code n’a pas d’erreur
  • vérifier que le code fait ce que je pense
  • vérifier que le code fonctionne dans différents scénarios
  • vérifier que le code fonctionne dans différents environnements


Il suffit de le faire tourner!

Il suffit de le faire tourner?

Comment (et quoi) tester

  • trust yourself
    • ❌ pas d’erreur
    • ❌ fait ce que je pense
    • ❌ différents scénarios
    • ❌ différents environnements
  • lancer un exemple d’utilisation
    • ✅ pas d’erreur
    • ❓ fait ce que je pense
    • ❌ différents scénarios
    • ❌ différents environnements
  • écrire des tests unitaires
    • ✅ pas d’erreur
    • ✅ fait ce que je pense
    • ✅ différents scénarios
    • ❌ différents environnements
  • git push ✅

Github actions

Scrits (yaml) qui se déclenchent dans certaines conditions

  • pull requests
  • push
  • tous les jours à minuit


→ faire tourner les tests unitaires

→ sur plusieurs versions de Python (open source ?)

→ sur plusieurs OS

Et cela tout le temps!

Github actions

sur plusieurs OS

Github actions

sur plusieurs OS ???


Warning

Python est interprété, mais peut se comporter différemment en fonction de l’OS

  • noms de fichiers
  • chemins
  • fichiers temporaires
  • permissions
  • modules spécifiques

one ring file to rule them all


Un package ça se décompose en :

  • du code Python

  • des méta données

    • un nom, une description, des auteur.e.s
    • des dépendances
    • une license


pyproject.toml

one ring file to rule them all


pyproject.toml + uv = <3


Gestion des dépendances


Gestion des dépendances


Gestion des dépendances


Gestion des dépendances


Gestion des dépendances


  • open source → être convenient

numpy>=2.1.0



  • closed source → restreindre autant que possible

numpy==2.1.3

Documentation

La première (et souvent la seule) chose que les gens verronts


Objectif: réduire au maximum l’effort requis pour comprendre le package.


Pour ça on a besoin de 2 choses:

  • Landing page
  • Diátaxis framework

Landing page

  • A quoi sert le package?
  • Dans quel contexte il s’inscrit (e.g., package Python)
  • Exemple usage minimaliste
  • Donner envie!

Landing page

Landing page

Landing page

Landing page

Diataxis

Plotnine

Aller plus loin

Merci !

J’ai dis des choses pertinentes ?

  • venez m’en parler !

J’ai dis des choses fausses ?

  • venez m’en parler !


Autres ?